package Filesystem;

# $Id: Filesystem.pm 333 2010-08-07 10:50:36Z dolbanavt $
# $Date: 2010-08-07 13:50:55 +0300 (Суб, 07 Авг 2010) $
# $HeadURL: https://robosearch.googlecode.com/svn/branches/reborn/lib/Filesystem.pm $
# $LastChangedRevision: 348 $

use parent qw( JIP::BaseClass Class::Accessor::Fast );
use JIP::ToolSet;
use Carp qw( croak );
use English qw( -no_match_vars );
use File::Spec::Functions qw( catfile );
use JIP::Utils qw( check_named_params );

our $VERSION = '1.0';

__PACKAGE__->follow_best_practice;

__PACKAGE__->mk_accessors( qw( host scratch_dir output_dir ) );

sub _init {
    my ( $self, $params_ref ) = @ARG;

    check_named_params(
        rules_ref  => {
            host_object => { required => 1, defined  => 1 },
            scratch_dir => { required => 1, defined  => 1 },
            output_dir  => { required => 1, defined  => 1 },
        },
        params_ref => $params_ref,
    );

    $self->set_host( $params_ref->{'host_object'} );
    $self->set_scratch_dir( $params_ref->{'scratch_dir'} );
    $self->set_output_dir( $params_ref->{'output_dir'} );

    return $self;
}

sub scratch_file {
    croak 'scratch_file() is abstract method';
}

sub output_file {
    croak 'output_file() is abstract method';
}

sub scratch_file_location {
    my $self = shift;

    return catfile( $self->get_scratch_dir, $self->scratch_file() );
}

sub output_file_location {
    my $self = shift;

    return catfile( $self->get_output_dir, $self->output_file() );
}

1;

__END__

=head1 NAME

Filesystem - базовый класс файловой системы

=head1 SYNOPSIS

    use Filesystem;

    my $fs = Filesystem->new(
        host_object => Host->new(),
        scratch_dir => '/path/to/scratch',
        output_dir  => '/path/to/output',
    );

    # имя временного файла
    say $fs->scratch_file();

    # путь к временному файлу
    say $fs->scratch_file_location();

    # имя файла
    say $fs->output_file();

    # путь к файлу
    say $fs->output_file_location();

=head1 DESCRIPTION

Абстрактный класс семейства определяющего файловую систему проекта.
Как называются те или иные файлы определяется конкретными реализациями.

Зависит от интерфейса класса Host - get_id и get_ip_address.

=head1 DEPENDENCIES

Class::Accessor::Fast (from CPAN)

JIP::ToolSet (from base_lib)

JIP::BaseClass (from base_lib)

JIP::Utils (from base_lib)

=head1 AUTHOR

Vladimir Zhavoronkov, <dolbanavt (at) Google Mail>

http://dolbanavt.livejournal.com/

=head1 LICENSE AND COPYRIGHT

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

=cut
